package com.hnqcgczy.supplier.utils;

import com.hnqcgczy.supplier.db.MyTransaction;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

/***
 * 统一完成JDBC 操作
 */
public class BaseDao {
    /**
     * 事务对象
     */
    private MyTransaction myTransaction;
    /**
     * 连接对象
     */
    private Connection conn;
    /**
     * 预处理对象
     */
    private PreparedStatement pstm;
    /**
     * 返回查询结果集
     */
    private ResultSet rs;

    //构造方法，完成事务初始化
    public BaseDao(MyTransaction myTransaction) {
        this.myTransaction = myTransaction;
        this.conn = this.myTransaction.getConn();
    }

    //无参构造
    public BaseDao() {
    }

    //set方法 给事务和连接对象赋值
    public void setMyTransaction(MyTransaction myTransaction) {
        this.myTransaction = myTransaction;
        this.conn = this.myTransaction.getConn();
    }

    /***
     * 统一绑定参数  给？赋值
     * @param pstm
     * @param obj  可变长度 参数
     * @throws SQLException
     */
    public void bindParams(PreparedStatement pstm, Object... obj) throws SQLException {
        if (obj != null && obj.length > 0) {
            //绑定参数
            for (int i = 1; i <= obj.length; i++) {
                pstm.setObject(i, obj[i - 1]);
            }
        }
    }

    /***
     * 统一释放资源
     * @throws SQLException
     */
    public void closeResource() throws SQLException {
        if (rs != null) {
            rs.close();
            rs = null;
        }
        if (pstm != null) {
            pstm.close();
            rs = null;
        }
    }

    /***
     * 统一完成 新增 修改 删除 ， 返回受影响行数
     * @param sql  预编译sql语句
     * @param obj  可变长度参数
     * @return 返回受影响行数
     * @throws SQLException
     */
    public int update(String sql, Object... obj) throws SQLException {
        //通过连接对象获得预编译对象
        pstm = conn.prepareStatement(sql);
        //统一动态绑定参数
        bindParams(pstm, obj);
        //执行sql 返回长度
        return pstm.executeUpdate();
    }

    /***
     * 统一完成 查询，返回结果集
     * @param sql  预编译sql
     * @param obj  可变长度参数
     * @return 结果集
     * @throws SQLException
     */
    public ResultSet query(String sql, Object... obj) throws SQLException {
        pstm = conn.prepareStatement(sql);
        bindParams(pstm, obj);
        rs = pstm.executeQuery();
        return rs;
    }
}
